/**
  ******************************************************************************
  * @file    gpio.h
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-09
  * @brief   gpio驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef __GPIO_H
#define __GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common.h"

/* 宏定义---------------------------------------------------------------------*/
/* gpio_port gpio端口 */
#define GPIO_PORTA                  (0x0)
#define GPIO_PORTB                  (0x1)
#define GPIO_PORTC                  (0x2)
#define GPIO_PORTD                  (0x3)
#define GPIO_PORTE                  (0x4)

/* gpio_mode gpio模式 */
#define GPIO_MODE_IN                (0x0)
#define GPIO_MODE_IPU               (0x1)
#define GPIO_MODE_ANALOG_IN         (0x2)
#define GPIO_MODE_OUT_PP            (0x3)
#define GPIO_MODE_OUT_OD            (0x4)
    
/* gpio_speed gpio速率 */
#define GPIO_SPEED_HIGH             (0x0) /* 高速 */
#define GPIO_SPEED_LOW              (0x1) /* 低速 */
    
/* 类型定义-------------------------------------------------------------------*/
/* gpio_config struct */
typedef struct io_config {
    uint8_t mode : 6;  /* @ref gpio_mode */
    uint8_t speed : 2; /* @ref gpio_speed */
} io_config_t;

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
void gpio_init(uint8_t port, uint8_t pin, io_config_t config);

void gpio_write(uint8_t port, uint8_t pin, uint8_t level);
uint8_t gpio_read(uint8_t port, uint8_t pin);
void gpio_toggle(uint8_t port, uint8_t pin);

#ifdef __cplusplus
}
#endif

#endif /* gpio.h */